<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head><meta name="generator" content="Hexo 3.9.0">

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->
    
        <meta name="description" content="锁全局解释器锁​    1、什么是全局解释器锁
　　　　　　在同一个进程中只要有一个线程获取了全局解释器（cpu）的使用权限，那么其他的线程就必须等待该线程的全局解释器（cpu）使　　　　用权消失后才能使用全局解释器（cpu）,即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu，这样">
    

    <!--Author-->
    
        <meta name="author" content="ck">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="锁的详解">
    

    <!--Open Graph Description-->
    

    <!--Open Graph Site Name-->
    <meta property="og:site_name" content="CK">

    <!--Type page-->
    
        <meta property="og:type" content="article">
    

    <!--Page Cover-->
    

    <meta name="twitter:card" content="summary">
    

    <!-- Title -->
    
    <title>锁的详解 - CK</title>

    <!-- Bootstrap Core CSS -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" integrity="sha384-y3tfxAZXuh4HwSYylfB+J125MxIs6mR5FOHamPBG064zB+AFeWH94NdvaCBm8qnd" crossorigin="anonymous">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet">

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/blog/css/style.css">

    <!-- Google Analytics -->
    


</head>


<body>

<div class="bg-gradient"></div>
<div class="bg-pattern"></div>

<!-- Menu -->
<!--Menu Links and Overlay-->
<div class="menu-bg">
    <div class="menu-container">
        <ul>
            
            <li class="menu-item">
                <a href="/blog/">
                    Home
                </a>
            </li>
            
            <li class="menu-item">
                <a href="/blog/archives">
                    Archives
                </a>
            </li>
            
            <li class="menu-item">
                <a href="/blog/about.html">
                    About
                </a>
            </li>
            
            <li class="menu-item">
                <a href="/blog/tags">
                    Tags
                </a>
            </li>
            
            <li class="menu-item">
                <a href="/blog/categories">
                    Categories
                </a>
            </li>
            
            <li class="menu-item">
                <a href="/blog/contact.html">
                    Contact
                </a>
            </li>
            
        </ul>
    </div>
</div>

<!--Hamburger Icon-->
<nav>
    <a href="#menu"></a>
</nav>

<div class="container">

    <!-- Main Content -->
    <div class="row">
    <div class="col-sm-12">

        <!--Title and Logo-->
        <header>
    <div class="logo">
        <a href="/blog/"><i class="logo-icon fa fa-cube" aria-hidden="true"></i></a>
        
    </div>
</header>

        <section class="main">
            
<div class="post">

    <div class="post-header">
        <h1 class="title">
            <a href="/blog/2019/08/12/锁的详解/">
                锁的详解
            </a>
        </h1>
        <div class="post-info">
            
                <span class="date">2019-08-12</span>
            
            
            
        </div>
    </div>

    <div class="content">

        <!-- Gallery -->
        

        <!-- Post Content -->
        <h1 id="锁"><a href="#锁" class="headerlink" title="锁"></a>锁</h1><h2 id="全局解释器锁"><a href="#全局解释器锁" class="headerlink" title="全局解释器锁"></a>全局解释器锁</h2><p>​    1、什么是全局解释器锁</p>
<p>　　　　　　在同一个进程中只要有一个线程获取了全局解释器（cpu）的使用权限，那么其他的线程就必须等待该线程的全局解释器（cpu）使　　　　用权消失后才能使用全局解释器（cpu）,即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu，这样的机制称为全局　　　　解释器锁（GIL）。</p>
<p>　　2、全局解释器锁的好处</p>
<p>　　　　　　1、避免了大量的加锁解锁的好处</p>
<p>　　　　　　2、使数据更加安全，解决多线程间的数据完整性和状态同步</p>
<p>　　3、全局解释器的缺点</p>
<p>　　　　　　多核处理器退化成单核处理器，只能并发不能并行。</p>
<p>同一时刻的某个进程下的某个线程只能被一个cpu所处理，所以在GIL锁下的线程只能被并发，不能被并行。 </p>
<h3 id="Ps-GIL锁"><a href="#Ps-GIL锁" class="headerlink" title="Ps:GIL锁"></a>Ps:GIL锁</h3><p>GIL全称Global Interpreter Lock，即全局解释器锁。 作用就是，限制多线程同时执行，保证同一时间内只有一个线程在执行</p>
<h2 id="并发与并行"><a href="#并发与并行" class="headerlink" title="并发与并行"></a>并发与并行</h2><h2 id="互斥锁"><a href="#互斥锁" class="headerlink" title="互斥锁"></a>互斥锁</h2><p><strong>概念:</strong><br>互斥就是互相排斥的意思,在多个进程或线程对同一个资源请求的时候,如果每个进程或线程请求的时候都加锁,别的进程或线程就没法访问这里的资源,就会一直等待.直到占用该资源的那个进程或线程释放了该锁.所以互斥锁又叫排他锁,又叫同步锁.</p>
<p>　　1、什么是同步锁？</p>
<p>　　　　同一时刻的一个进程下的一个线程只能使用一个cpu，要确保这个线程下的程序在一段时间内被cpu执，那么就要用到同步锁。</p>
<p>　　2、为什么用同步锁？</p>
<p>　　　　因为有可能当一个线程在使用cpu时，该线程下的程序可能会遇到io操作，那么cpu就会切到别的线程上去，这样就有可能会影响到该程　　序结果的完整性。</p>
<p>　　3、怎么使用同步锁？</p>
<p>　　　　只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。</p>
<h3 id="Ps-扩展知识"><a href="#Ps-扩展知识" class="headerlink" title="Ps:扩展知识"></a>Ps:扩展知识</h3><p>　　　　1、GIL的作用：多线程情况下必须存在资源的竞争，GIL是为了保证在解释器级别的线程唯一使用共享资源（cpu）。</p>
<p>　　　　2、同步锁的作用：为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。</p>
<h2 id="递归锁和死锁"><a href="#递归锁和死锁" class="headerlink" title="递归锁和死锁"></a>递归锁和死锁</h2><p>什么是死锁？</p>
<p>　　　　指两个或两个以上的线程或进程在执行程序的过程中，因争夺资源而相互等待的一个现象</p>
<p>什么是递归锁？</p>
<p>　　　　在Python中为了支持同一个线程中多次请求同一资源，Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter</p>
<p>　　变量，counter记录了acquire的次数，从而使得资源可以被多次require。直到一个线程所有的acquire都被release，其他的线程才能获</p>
<h2 id="什么是信号量？"><a href="#什么是信号量？" class="headerlink" title="什么是信号量？"></a>什么是信号量？</h2><p>　　　　同进程的一样，semaphore管理一个内置的计数器，每当调用acquire()时内置函数-1，每当调用release()时内置函数+1。</p>
<p>　　　计数器不能为0，当计数器为0时acquire（）将阻塞线程，直到其他线程调用release（）。</p>
<h1 id="MySql的乐观锁和悲观锁"><a href="#MySql的乐观锁和悲观锁" class="headerlink" title="MySql的乐观锁和悲观锁"></a>MySql的乐观锁和悲观锁</h1><h2 id="悲观锁"><a href="#悲观锁" class="headerlink" title="悲观锁"></a><strong>悲观锁</strong></h2><p>悲观锁(Pessimistic Lock),顾名思义就是很悲观.每次去操作数据的时候,都会认为别人会修改.所以为了防止别人修改,就在操作的时候上锁.这样别人来访问的时候就会阻塞在那里直到锁被是释放.传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁.</p>
<p><strong>使用场景:</strong><br>商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单的时候必须确保该商品status为1.假设商品id为1.</p>
<p><strong>优点和不足</strong><br>悲观锁的策略是先取锁再访问,保证了数据的安全性.但是效率方面,处理加锁机制会让数据库产生额外的开销.<br>还有即使增加了产生死锁的可能.<br>所以一般只有在写的操作冲突多的时候才使用悲观锁,而读的操作不需要加锁.</p>
<h2 id="乐观锁"><a href="#乐观锁" class="headerlink" title="乐观锁"></a>乐观锁</h2><p>乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为比人不会修改,所以不会上锁.<br>但是在更新数据的时候,会判断一下在更新数据的这段时间内,数据有没有被修改.如果被修改了,如果被修改了<br>就取消这次操作,如果没有被修改,则使得这次操作生效.一般使用版本号或者时间戳的方式来实现.</p>
<p><strong>优点和不足</strong> 乐观并发控制相信事务之间的数据竞争的概率是比较小的,会先进行操作. 再提交的时候再进行验证这次提交是否可行,因此不会有任何的死锁和锁.但是这样做 还是有问题的,例如如果某两个事务对同一行的数据同时进行了修改,经过修改之后, 同时写进了数据库,这时就会出现问题.所以乐观锁,一般用在读数据比较多的地方. 而对于写数据比较多的地方,我们最好使用悲观锁来解决. </p>
<h2 id="行级锁和死锁"><a href="#行级锁和死锁" class="headerlink" title="行级锁和死锁"></a><strong>行级锁和死锁</strong></h2><p>在MySql中,行级锁并不是直接锁记录,而是锁索引.索引分为主键索引和非主键索引两种.<br>如果一条sql语句操作了主键索引,MySql就会锁住这条主键索引.如果一条语句操作了<br>非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引.在UPDATE,DELETE操作时,<br>MYSQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的<br>next-key locking<br>当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引.另一个锁住了非主键索引,在等待主键索引.<br>就发生了死锁.</p>
<p>放生死锁以后,一般InnoDB可以检测到,会将一个事务进行回滚,释放掉占用的锁.另一个事务获取到锁完成事务.</p>

    </div>

    

    

    <!-- Comments -->
    

</div>
        </section>

    </div>
</div>


</div>

<!-- Footer -->
<div class="push"></div>

<footer class="footer-content">
    <div class="container">
        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6 footer-about">
                <h2>About</h2>
                <p>
                    This theme was developed by <a href="https://github.com/klugjo">Jonathan Klughertz</a>. The source code is available on Github. Create Websites. Make Magic.
                </p>
            </div>
            
    <div class="col-xs-6 col-sm-6 col-md-3 col-lg-3 recent-posts">
        <h2>Recent Posts</h2>
        <ul>
            
            <li>
                <a class="footer-post" href="/blog/2019/08/12/如何快速搭建hexo技术博客/">如何快速搭建hexo技术博客</a>
            </li>
            
            <li>
                <a class="footer-post" href="/blog/2019/08/12/二进制字典数据处理/">二进制字典数据处理</a>
            </li>
            
            <li>
                <a class="footer-post" href="/blog/2019/08/12/Dos-命令手记/">Dos-命令手记</a>
            </li>
            
            <li>
                <a class="footer-post" href="/blog/2019/08/12/Mysql-命令手记/">Mysql-命令手记</a>
            </li>
            
        </ul>
    </div>



            
        </div>
        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
                <ul class="list-inline footer-social-icons">
                    
                    <li class="list-inline-item">
                        <a href="https://github.com/klugjo/hexo-theme-alpha-dust">
                            <span class="footer-icon-container">
                                <i class="fa fa-github"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://twitter.com/?lang=en">
                            <span class="footer-icon-container">
                                <i class="fa fa-twitter"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://www.facebook.com/">
                            <span class="footer-icon-container">
                                <i class="fa fa-facebook"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://www.instagram.com/">
                            <span class="footer-icon-container">
                                <i class="fa fa-instagram"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://dribbble.com/">
                            <span class="footer-icon-container">
                                <i class="fa fa-dribbble"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://plus.google.com/">
                            <span class="footer-icon-container">
                                <i class="fa fa-google-plus"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://www.behance.net/">
                            <span class="footer-icon-container">
                                <i class="fa fa-behance"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="https://500px.com/">
                            <span class="footer-icon-container">
                                <i class="fa fa-500px"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="mailto:test@example.com">
                            <span class="footer-icon-container">
                                <i class="fa fa-envelope-o"></i>
                            </span>
                        </a>
                    </li>
                    
                    
                    <li class="list-inline-item">
                        <a href="\#">
                            <span class="footer-icon-container">
                                <i class="fa fa-rss"></i>
                            </span>
                        </a>
                    </li>
                    
                </ul>
            </div>
        </div>
        <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
                <div class="footer-copyright">
                    @Untitled. All right reserved | Design & Hexo <a href="http://www.codeblocq.com/">Jonathan Klughertz</a>
                </div>
            </div>
        </div>
    </div>
</footer>

<!-- After footer scripts -->

<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Tween Max -->
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.18.5/TweenMax.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Custom JavaScript -->
<script src="/blog/js/main.js"></script>

<!-- Disqus Comments -->



</body>

</html>